/*global pi, window, document */
// 页面模块，主要处理一些兼容性方面的问题

pi.mod.define('pi.html', function(pi) {
	"use strict";
	// 定义模块
	var module = {},
	// 加载指定的JS或CSS文件
	load = function(doc, head, url, charset, isCss, callback) {
		var node = doc.createElement(isCss ? 'link': 'script');
		node.charset = charset;
		node.readyState = undefined;
		node.onerror = function() {
			node.onload = node.onerror = node.onreadystatechange = undefined;
			head.removeChild(node);
			callback(false);
		};
		node.onload = node.onreadystatechange = function() {
			/*if (node.readyState === 'loaded' ||
				node.readyState === 'complete' ||
				node.readyState === undefined) {
			};*/
			// Ensure only run once and handle memory leak in IE
			node.onload = node.onerror = node.onreadystatechange = undefined;
			// Remove the script to reduce memory leak
			if (!isCss) {
				head.removeChild(node);
			}
			callback(true);
		};
		if (isCss) {
			node.rel = 'stylesheet';
			node.href = url;
		} else {
			node.async = true;
			node.src = url;
		}
		head.appendChild(node);
	};

	// 获得iframe节点的window
	module.getWidth = function(node) {
		return pi.lang.parseIntUnsafe(node.style.width);
	};
	// 获得iframe节点的window
	module.getHeight = function(node) {
		return pi.lang.parseIntUnsafe(node.style.height);
	};
	// 获得iframe节点的window
	module.getIFrameWindow = function(node) {
		return node.contentWindow || document.frames[node.id].window;
	};
	// 获得document上的head节点
	module.getHead = function(doc) {
		return doc.head || doc.getElementsByTagName('head')[0] || doc.documentElement;
	};
	// 获得document上的所有指定属性的元素
	module.getElementsByAttr = function(doc, attr, value) {
		var i, e, arr = doc.getElementsByTagName("*"),
		result = [];
		if (value !== undefined) {
			for (i = arr.length - 1; i >= 0; i--) {
				e = arr[i];
				if (e.getAttribute(attr) != value) {
					result.push(e);
				}
			}
			return result;
		}
		for (i = arr.length - 1; i >= 0; i--) {
			e = arr[i];
			if (e.getAttribute(attr) !== undefined) {
				result.push(e);
			}
		}
		return result;
	};
	// 创建Iframe节点的方法
	module.createIframeNode = function(doc) {
		var node = doc.createElement("iframe");
		node.scrolling = "no";
		node.hspace = "0px";
		node.vspace = "0px";
		node.frameborder = "0px";
		node.frameSpacing = "0px";
		node.marginWidth = "0px";
		node.marginHeight = "0px";
		node.style.border = "0px";
		node.style.position = "absolute";
		node.style.display = "none";
		node.offsetWidth = 0;
		node.offsetHeight = 0;
		return node;
	};
	// 创建指定文本的css节点
	module.createCssNode = function(doc, text) {
		var node = doc.createElement('style');
		node.type = "text/css";
		// ie
		if (node.styleSheet) {
			node.styleSheet.cssText = text;
		} else {
			node.appendChild(doc.createTextNode(text));
		}
		return node;
	};
	// 创建指定文本的js节点
	module.createJsNode = function(doc, text) {
		var node = doc.createElement('script');
		node.type = "text/javascript";
		try {
			node.appendChild(doc.createTextNode(text));
		} catch(ex) {
			// ie
			node.text = text;
		}
		return node;
	};
	// 获得指定文档的内容宽度
	module.contentWidth = function(doc) {
		return Math.max(doc.body.scrollWidth, doc.documentElement.scrollWidth);
	};
	// 获得指定文档的内容高度
	module.contentHeight = function(doc) {
		return Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight);
	};
	// 获得指定节点元素相对根元素的x坐标
	module.offsetLeft = function(el, root) {
		var x = 0;
		while (el && el !== root) {
			x += el.offsetLeft;
			el = el.offsetParent;
		}
		return x;
	};
	// 获得指定节点元素相对根元素的y坐标
	module.offsetTop = function(el, root) {
		var y = 0;
		while (el && el !== root) {
			y += el.offsetTop;
			el = el.offsetParent;
		}
		return y;
	};
	// 获得指定节点元素相对根元素的坐标
	module.offsetPos = function(el, root) {
		var x = 0,
		y = 0;
		while (el && el !== root) {
			x += el.offsetLeft;
			y += el.offsetTop;
			el = el.offsetParent;
		}
		return [x, y];
	};
	// 设置指定元素的类样式
	module.setClass = function(el, str) {
		// TODO el.setAttribute("className", str);
		el.className = str;
	};
	// 判断是否有 className
	module.hasClass = function(element, className) {
		return element.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)'));
	};
	// 添加 className
	module.addClass = function(element, className) {
		if (!element.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)'))) {
			element.className += " " + className;
		}
	};
	// 移除 className
	module.removeClass = function(element, className) {
		var reg = new RegExp('(\\s|^)' + className + '(\\s|$)');
		if (element.className.match(reg)) {
			element.className = element.className.replace(reg, ' ');
		}
	};
	// 替换 className
	module.replaceClass = function(element, className, newClassName) {
		var s = element.className,
		reg = new RegExp('(\\s|^)' + className + '(\\s|$)'),
		newReg = new RegExp('(\\s|^)' + newClassName + '(\\s|$)');
		if (s.match(reg)) {
			s = element.className.replace(reg, ' ');
		}
		if (!s.match(newReg)) {
			s += " " + newClassName;
		}
		element.className = s;
	};
	// 在指定元素上获取指定属性的元素，一直查找到document节点，如果没有设置value，则直接返回该节点， 否则与value值进行比较
	module.getElement = function(el, attr, value, stopAttr) {
		var v, doc = el.ownerDocument;
		while (el && el !== doc) {
			if (stopAttr && el.getAttribute(stopAttr)) {
				return;
			}
			v = el.getAttribute(attr);
			if (v) {
				if (value) {
					if (value === v) {
						return el;
					}
				} else {
					return el;
				}
			}
			el = el.parentNode;
		}
		return;
	};
	//将指定的元素拷贝到指定文档环境中，主要用于跨Iframe操作
	module.copyElement = function(el, doc) {
		var i, style = el.style,
		attr = el.attr,
		v, node = doc.createElement(el.nodeName.toLowerCase());
		for (i in style) {
			if ((v = style[i])) {
				node.style[i] = v;
			}
		}
		for (i = attr.length - 1; i >= 0; i--) {
			if ((v = attr[i].nodeValue)) {
				node.setAttribute(attr[i].nodeName, v);
			}
		}
		if ((v = el.innerHTML)) {
			node.innerHTML = v;
		}
		return node;
	};

	// 加载指定的JS文件数组
	module.loadJS = function(doc, array, callback) {
		var amount = array.length,
		i, fun, head, arr;
		if (amount === 0) {
			callback([]);
			return;
		}
		fun = function(index, array, callback) {
			return function(result) {
				if (!result) {
					arr.push(array[index]);
					arr.error = -13;
					arr.reason = "load error";
				}
				amount--;
				if (amount < 1) {
					callback(arr);
				}
			};
		};
		head = doc.head || doc.getElementsByTagName('head')[0] || doc.documentElement;
		arr = [];
		for (i = amount - 1; i >= 0; i--) {
			load(doc, head, array[i], 'utf8', false, fun(i, array, callback));
		}
	};

	// 在指定的对象上绑定指定的方法
	module.bind = function(obj, eventName, method) {
		if (obj.addEventListener) {
			return obj.addEventListener(eventName, method, false);
		} else if (obj.attachEvent) {
			obj.attachEvent("on" + eventName, method);
		} else {
			obj["on" + eventName] = method;
		}
	};

	// 在指定的对象上移除指定的方法
	module.unbind = function(obj, eventName, method) {
		if (obj.removeEventListener) {
			obj.removeEventListener(eventName, method, false);
		} else if (obj.detachEvent) {
			obj.detachEvent("on" + eventName, method);
		} else {
			delete obj["on" + eventName];
		}
	};
	// 修正事件
	module.fixEvent = function(e, forelet) {
		e.forelet = forelet;
		if(e.fixed){
			return e;
		}
		// IE的事件在window上
		if (!e) {
			e = forelet.getWindow().event;
			// 在IE 浏览器中，获得触发事件的对象源（HTML标签）是通过event 对象的srcElement 属性；
			// 在标准的DOM中，获得触发事件的对象源（HTML标签）是通过event 对象的target 属性；
			e.target = e.srcElement;
			// 在标准的DOM中：既有keyCode属性，还有charCode 属性，但在标准的DOM中，keypress 事件中keyCode 属性值始终为0值；
			//在IE 浏览器中：事件对象只有keyCode属性，没有charCode 属性，keypress 事件中的keyCode 属性值等同于标准DOM 中的charCode 属性的值
			e.charCode = e.keyCode;
		}
		// 不知道为什么，基于body的x,clientX和基于事件对象上的offsetX加起来差2个像素，y也有这个问题
		e.xx = e.x - 2;
		e.yy = e.y - 2;
		e.fixed = true;
		return e;
	};

	return module;
});